02.5 精通自定义 View 之视图动画——逐帧动画

返回自定义 View 目录

2.5.1 XML 实现

新建一个动画 XML 文件,在文件中使用 <animation-list> 标签来定义动画帧序列,使用 <item> 标签来定义动画的每一帧,并在其中指定帧的持续时间等属性。

1)定义 XML 动画文件

res/drawable/playing_anim.xml 或 res/anim/playing_anim.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@mipmap/img00" android:duration="120" />
<item android:drawable="@mipmap/img01" android:duration="120" />
<item android:drawable="@mipmap/img02" android:duration="120" />
<item android:drawable="@mipmap/img03" android:duration="120" />
<item android:drawable="@mipmap/img04" android:duration="120" />
<item android:drawable="@mipmap/img05" android:duration="120" />
<item android:drawable="@mipmap/img06" android:duration="120" />
<item android:drawable="@mipmap/img07" android:duration="120" />
<item android:drawable="@mipmap/img08" android:duration="120" />
<item android:drawable="@mipmap/img10" android:duration="120" />
<item android:drawable="@mipmap/img11" android:duration="120" />
<item android:drawable="@mipmap/img12" android:duration="120" />
<item android:drawable="@mipmap/img13" android:duration="120" />
<item android:drawable="@mipmap/img14" android:duration="120" />
<item android:drawable="@mipmap/img15" android:duration="120" />
<item android:drawable="@mipmap/img16" android:duration="120" />
<item android:drawable="@mipmap/img17" android:duration="120" />
<item android:drawable="@mipmap/img18" android:duration="120" />
<item android:drawable="@mipmap/img19" android:duration="120" />
<item android:drawable="@mipmap/img20" android:duration="120" />
<item android:drawable="@mipmap/img21" android:duration="120" />
<item android:drawable="@mipmap/img22" android:duration="120" />
<item android:drawable="@mipmap/img23" android:duration="120" />
<item android:drawable="@mipmap/img24" android:duration="120" />
</animation-list>

oneshot 用来控制动画是否循环播放,如果取值为 true,表示动画不会循环播放,否则动画会循环播放;duration 用来指定每一帧的持续播放时间。

2)设置 ImageView

设置动画资源有两种方式:android:src、android:background。

1
2
3
4
5
<ImageView
android:id="@+id/frame_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/playing_anim"/>

3)AnimationDrawable 开始动画

1
2
3
ImageView image = findViewById(R.id.frame_image);
AnimationDrawable anim = (AnimationDrawable) image.getDrawable();
anim.start();

注意:
android:src 对应 image.getDrawable();
android:background 对应 image.getBackground();

2.5.2 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
AnimationDrawable animationDrawable = new AnimationDrawable();
int id = 0;
for (int i = 0; i < 24; i++) {
if (i < 10) {
id = getResources().getIdentifier("img0" + i, "mipmap", getPackageName());
} else {
id = getResources().getIdentifier("img" + i, "mipmap", getPackageName());
}
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable, 120);
}
image.setImageDrawable(animationDrawable);
animationDrawable.setOneShot(false);
animationDrawable.start();

帧动画使用比较简单,但是容易引起 OOM,在使用帧动画时应该尽量避免使用过多尺寸较大的图片。